% $Header: /cvsroot/html2ps/postscript/box.table.cell.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $

/box-table-cell-apply-vertical-align { % => Baseline Height Cell
  dup /vertical-align
  get-css-value                    % => Baseline Height Cell Valign
  {                                % => Baseline Height Cell Valign
    dup /baseline    eq {
      pop                          % => Baseline Height Cell 

      2 index
      1 index box-table-cell-get-baseline
      sub                          % => Baseline Height Cell Delta

      1 index get-top              % => Baseline Height Cell Delta OldTop
      1 index neg
      0
      4 index /offset call-method  % => Baseline Height Cell Delta OldTop
      2 index put-top              % => Baseline Height Cell Delta

      pop
      
      exit
    } if
    dup /bottom      eq {
      pop                          % => Baseline Height Cell 

      1 index
      1 index box-container-get-real-full-height
      sub                          % => Baseline Height Cell Delta

      1 index get-top              % => Baseline Height Cell Delta OldTop
      
      1 index neg 0
      4 index
      /offset call-method          % => Baseline Height Cell Delta OldTop

      2 index put-top              % => Baseline Height Cell Delta
      pop
      exit
    } if
    dup /middle      eq {
      pop                          % => Baseline Height Cell 

      1 index
      1 index box-container-get-real-full-height
      sub 2 div
      0 max                        % => Baseline Height Cell Delta

      1 index get-top              % => Baseline Height Cell Delta OldTop
      
      1 index neg 0
      4 index
      /offset call-method          % => Baseline Height Cell Delta OldTop

      2 index put-top              % => Baseline Height Cell Delta
      pop
      exit
    } if
    dup /super       eq { pop exit } if
    dup /sub         eq { pop exit } if
    dup /text-top    eq { pop exit } if
    dup /text-bottom eq {
      pop                          % => Baseline Height Cell 

      2 index
      1 index box-table-cell-get-baseline
      sub                          % => Baseline Height Cell Delta

      1 index get-top              % => Baseline Height Cell Delta OldTop
      1 index neg
      0
      4 index /offset call-method  % => Baseline Height Cell Delta OldTop
      2 index put-top              % => Baseline Height Cell Delta

      pop
      
      exit
    } if
    dup /top         eq { pop exit } if
    pop exit 
  } loop

  pop pop pop
} def

/box-table-cell-create {
  box-container-create
  dup box-table-cell-setup-methods
  dup /box-table-cell add-type

  dup /Colspan 1 put
  dup /Rowspan 1 put
  dup /column  0 put
  dup /row     0 put
} def

/box-table-cell-get-baseline {     % => Cell
  dup box-container-get-first-data % => Cell First
  dup /null eq {
    pop pop 0
  } {
    get-baseline exch pop
  } ifelse
} def

/box-table-cell-get-colspan {
  /Colspan get
} def

/box-table-cell-get-rowspan {
  /Rowspan get
} def

/box-table-cell-put-colspan {
  exch /Colspan exch put
} def

/box-table-cell-put-rowspan {
  exch /Rowspan exch put
} def

/box-table-cell-reflow {           % => Context Parent Cell
% Determine upper-left _content_ corner position of current box
  1 index get-current-x
  1 index get-extra-left add
  1 index put-left                 % => Content Parent Cell

% NOTE: Table cell margin is used as a cell-spacing value
  1 index get-current-y
  1 index get-border-top-width sub
  1 index get-padding-top sub
  1 index put-top                  % => Content Parent Cell

% CSS 2.1: 
% Floats, absolutely positioned elements, inline-blocks, table-cells, and elements with 'overflow' other than
% 'visible' establish new block formatting contexts.
  2 index context-push
  dup get-uid
  3 index context-push-container-uid

% Reflow cell content
  2 index 1 index
  box-container-reflow-content     % => Content Parent Cell

% Extend the table cell height to fit all contained floats
% Determine the bottom edge corrdinate of the bottommost float
  2 index context-float-bottom     % => Content Parent Cell FloatBottom
  dup /null ne {
    1 index box-generic-extend-height
  } {
    pop
  } ifelse                         % => Content Parent Cell 

% Restore old context
  2 index context-pop-container-uid
  2 index context-pop

  pop pop pop 
} def

/box-table-cell-setup-methods {
  dup /Methods get
  dup /reflow {box-table-cell-reflow} put
  pop pop
} def

